[筆記] Hadoop 練習


1. 安裝 VM 並新增 Ubuntu 的虛擬機

下載 64位元 伺服器版 20.04 版的 ubuntu 系統

VirtualBox 參數:
Storage: 20 GB
RAM: 4GB

隨後完成基本設定

2.hadoop 環境設定

首先下載 SSH 以方便用 cmd 進行作業

$ sudo apt-get install ssh

下載完後開啟 cmd 使用遠端登入,執行以下指令(Hadoop 由 Java 建構而成,因此要先安裝 Java 的執行環境)

$ sudo apt update
$ sudo apt-get upgrade
$ sudo apt install default-jdk

驗證 java 版本

$ java -version

下載 Hadoop

$ wget https://dlcdn.apache.org/hadoop/common/hadoop-3.2.3/hadoop-3.2.3.tar.gz

Decompression:
解壓縮安裝包

$ tar -xzvf hadoop-3.2.3.tar.gz

Move Hadoop binary file:
將執行檔移動到特定資料夾上

$ sudo mv hadoop-3.2.3 /usr/local/hadoop

執行看看你下載的 Hadoop 是否正常

$ /usr/local/hadoop/bin/hadoop
#會報錯
ERROR: JAVA_HOME is not set and could not be found.

需要讓 Hadoop 知道你的 Java 執行環境
找出你的 Java 路徑:

$ readlink -f /usr/bin/java | sed "s:bin/java::"
/usr/lib/jvm/java-11-openjdk-amd64/

設定你的 Hadoop 設定檔:

$ vi /usr/local/hadoop/etc/hadoop/hadoop-env.sh
# 加入以下程式碼
JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64/

驗證是否成功

$ /usr/local/hadoop/bin/hadoop version

3.Hadoop - Standalone

Hadoop Modo 分為以下幾個:
1.獨立模式 (Standalone)
只需要一台 host 即可
2.偽分佈模式 (Pseudo-Distributed)
只需要一台 host 即可
3.多機安裝模式 (Fully-Distributed)
需要多個 host 來達到分散 (Distributed) 的效果

Hadoop 預設的模式就是 Standalone,只要完成幾個步驟即可使用,Standalone 僅供測試與體驗用途,不適合執行大量運算或是儲存大量資料

範例:執行 Hadoop standalone 模式下的 grep

grep 基本語法:

<hadoop> 執行檔 jar <PATH>/<MapReduce>.jar grep <input> <output> <正規表示法>

設定 input:
input 為需要被 MapReduce 處理的原始文件
在這個範例中,我們以 /usr/local/hadoop/etc/hadoop/*.xml 作為示範

$ mkdir ~/input
$ cp /usr/local/hadoop/etc/hadoop/*.xml ~/input

正規表示法:
以 'dfs[a-z.]+' 作為範例,代表 input 資料夾中,所有 dfs 開頭的檔案內容

$ /usr/local/hadoop/bin/hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.3.jar grep input output 'dfs[a-z.]+'

在自動生成的 output 資料夾中出現以下資料即成功(執行前需確認 output 資料夾不存在,否則會報錯)

4.Hadoop - Pseudo-Distributed

Pseudo-Distributed 與 Standalone 運作方式類似,無法擁有 Hadoop 的容錯機制與分散式等優點,Pseudo-Distributed 的 daemon 是在不同 JVM 運作,儲存模式也與 Standalone 一樣,可以使用 local file system 或是 HDFS

Hadoop 依據功能不同,設定檔可分為以下部份:
core-site.xml
hdfs-site.xml
mapred-site.xml
yarn-site.xml

設定檔格式:
Property 屬性
name: 屬性名稱
value: 屬性質
description: 屬性描述

<configuration>
  <property>
    <name></name>
    <value></value>
    <description></description>
  </property>
</configuration>

1.core-site.xml:

$ sudo vi /usr/local/hadoop/etc/hadoop/core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>

2.hdfs-site.xml:

$ sudo vi /usr/local/hadoop/etc/hadoop/hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>

3.mapred-site.xml:

$ sudo vi /usr/local/hadoop/etc/hadoop/mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>

4.yarn-site.xml:

$ sudo vi /usr/local/hadoop/etc/hadoop/yarn-site.xml
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>

啟動 Hadoop 相關 service

格式化 NameNode:

$ /usr/local/hadoop/bin/hdfs namenode -format

免密碼設定:

$ ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

編輯 PermitRootLogin

$ sudo vi /etc/ssh/sshd_config
# 新增這三行
PermitRootLogin yes
PasswordAuthentication yes
PubkeyAuthentication yes

重啟 ssh

$ sudo service ssh restart

啟動 NameNode、DataNode、YARN:

$ export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64/
$ cd  /usr/local/hadoop/sbin/
$ ./start-dfs.sh
$ ./start-yarn.sh

使用 net-tools 測試有無成功

$ sudo apt install net-tools
$ sudo netstat -ntlp

有出現 port 9000 即成功

5. Hadoop Pseudo-Distributed - MapReduce

基本流程:

  • 格式化文件系統
  • 啟動 NameNode / DataNode
  • 創建 input 資料夾
  • 瀏覽 NameNode 的 Web 界面
  • 創建執行 MapReduce 作業所需的 HDFS 目錄
  • 將 input 文件複製到分布式文件系統中
  • 運行 MapReduce
  • 檢查輸出文件

jps 檢查服務:

$ jps
35587 NameNode
35780 DataNode
36567 NodeManager
36010 SecondaryNameNode
36987 Jps
36206 ResourceManager

關閉防火牆進入 NameNode 的 Web 界面

$ sudo ufw disable

在瀏覽器上輸入 http://xxx.xxx.xx.xx:9870/ (虛擬機連的 ip)

創建執行 MapReduce 作業所需的 HDFS 目錄

創建 MapReduct 測試資料夾在分散式系統中:

$ /usr/local/hadoop/bin/hdfs dfs -mkdir /test

選擇 Utilities - Browse the file system

將輸入文件複製到分布式文件系統中:

$ /usr/local/hadoop/bin/hdfs dfs -put /usr/local/hadoop/etc/hadoop/*.xml /test

運行 MapReduce
建立官方的 example 所需要的目錄

$ /usr/local/hadoop/bin/hdfs dfs -mkdir /user
$ /usr/local/hadoop/bin/hdfs dfs -mkdir /user/u 
$ /usr/local/hadoop/bin/hdfs dfs -mkdir input

複製資料進 input:

$ /usr/local/hadoop/bin/hdfs  dfs -put  /usr/local/hadoop/etc/hadoop/*.xml input

檢查 etc/hadoop/mapred-site.xml 是否包含以下敘述:

<property>
  <name>yarn.app.mapreduce.am.env</name>
  <value>HADOOP_MAPRED_HOME=/usr/local/hadoop</value>
</property>
<property>
  <name>mapreduce.map.env</name>
  <value>HADOOP_MAPRED_HOME=/usr/local/hadoop</value>
</property>
<property>
  <name>mapreduce.reduce.env</name>
  <value>HADOOP_MAPRED_HOME=/usr/local/hadoop</value>
</property>

新增完後,重啟

$ ./stop-dfs.sh
$ ./stop-yarn.sh
$ ./start-dfs.sh
$ ./start-yarn.sh

運行 MapReduce

$ /usr/local/hadoop/bin/hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.3.jar grep input output 'dfs[a-z.]+'

6. Hadoop - Fully-Distributed

首先 VM 內需有三台不同 IP 的虛擬主機,並將 hadoop 環境架設完畢

1. 設定主機名稱,並重登(logout)

Master:

$ hostnamectl set-hostname master

Slave1:

$ hostnamectl set-hostname slave1

Slave2:

$ hostnamectl set-hostname slave2

2. Hosts 設定檔 (Master, Slave1, Slave2):

三台虛擬機皆須設定

sudo vi /etc/hosts

<MASTER_IP_ADDRESS> master
<SLAVE1_IP_ADDRESS> slave1
<SLAVE2_IP_ADDRESS> slave2

3. 設定檔

1.core-site.xml:

$ sudo vi /usr/local/hadoop/etc/hadoop/core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>
<property>
<name>fs.tmp.dir</name>
<value>/usr/local/hadoop/tmp</value>
</property>
</configuration>

2.hdfs-site.xml:

$ sudo vi /usr/local/hadoop/etc/hadoop/hdfs-site.xml

dfs.replication 代表一台 Node 要儲存幾份檔案
數字的設定不能 > 實際機器數量

<configuration>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/usr/local/hadoop/hdfs/name</value>
</property>
<property>
<name>dfs.namenode.data.dir</name>
<value>/usr/local/hadoop/hdfs/data</value>
</property>
</configuration>

3.mapred-site.xml:

$ sudo vi /usr/local/hadoop/etc/hadoop/mapred-site.xml
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=/usr/local/hadoop</value>
</property>
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=/usr/local/hadoop</value>
</property>
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=/usr/local/hadoop</value>
</property>

4.yarn-site.xml:

$ sudo vi /usr/local/hadoop/etc/hadoop/yarn-site.xml
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>master:8035</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>master:8030</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>master:8032</value>
</property>
<property>
<name>yarn.nodemanager.address</name>
<value>master:59392</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>master:8033</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>master:8088</value>
</property>

5.

$ sudo vi /usr/local/hadoop/etc/hadoop/works
#加入以下兩行字
slave1
slave2
$ sudo vi /usr/local/hadoop/etc/hadoop/slaves
#加入以下兩行字
slave1
slave2
$ sudo vi /usr/local/hadoop/etc/hadoop/master
#加入以下字
master

4. 將設定檔複製到另兩台虛擬機

分別將設定檔複製到 slave-1, slave-2

# 打入 name 與 ip
$ scp /usr/local/hadoop/etc/hadoop/* <slave_username>@<slave_IP>:/usr/local/hadoop/etc/hadoop/

5. ssh 設定

ssh 免密碼設定:

$ ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

編輯 PermitRootLogin

$ sudo vi /etc/ssh/sshd_config
# 新增這三行
PermitRootLogin yes
PasswordAuthentication yes
PubkeyAuthentication yes

重啟 ssh

$ sudo service ssh restart

最後在各台虛擬機都 ssh 另兩台虛擬機,使虛擬機互有金鑰

6. Restart Master、slave1、slave2

Master:

#stop
$ ./stop-dfs.sh  ; ./stop-yarn.sh

#格式化
$ /usr/local/hadoop/bin/hdfs namenode -format

#start
$ ./start-dfs.sh  ; ./start-yarn.sh

slave1、slave2

#stop
$ ./stop-dfs.sh  ; ./stop-yarn.sh

#格式化
$ /usr/local/hadoop/bin/hdfs namenode -format

#start
$ ./start-dfs.sh

最後在網址上輸入 master ip + :9870,datanode有呈現另兩台虛擬機,即成功

#hadoop #mapreduce #standalone #Pseudo-Distributed #Fully-Distributed






你可能感興趣的文章

How to build CICD with Jenkins as code based on container

How to build CICD with Jenkins as code based on container

Python Monkey Patch 入門教學

Python Monkey Patch 入門教學

滲透測試重新打底(3.4)--論Web入侵之Cross-site Scripting (XSS)漏洞

滲透測試重新打底(3.4)--論Web入侵之Cross-site Scripting (XSS)漏洞






留言討論